package cn.anlucky.admin.generation.bean;



import cn.anlucky.admin.common.utils.StringUtils;
import cn.anlucky.admin.generation.povo.GenerationPo;
import com.baomidou.mybatisplus.generator.config.builder.CustomFile;
import lombok.Getter;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Getter
public class GenerationPoBean {

    /**
     * 代码生成配置Bean对象
     *
     * @return GenerationPo
     */
    public static GenerationPo getGenerationPo(String dbUrl,String dbUserName,String dbPassword) {
        GenerationPo generationPo = new GenerationPo();
        // 作者
        generationPo.setAuthor("Lucky");
        // 生成代码文件输出位置
        generationPo.setOutputDir("D:/Generator/lucky");
        generationPo.setDbUrl(dbUrl);
        generationPo.setDbUserName(dbUserName);
        generationPo.setDbPassword(dbPassword);
        // 新增   时间自动填充
        generationPo.setCreateTimeField("create_time");
        // 修改   时间自动填充
        generationPo.setUpdateTimeField("update_time");
        // 新增   创建人自动填充
        generationPo.setCreateByField("create_by");
        // 修改   修改人自动填充
        generationPo.setUpdateByField("update_by");
        // 删除   逻辑删除字段
        generationPo.setDeleteFlagField("del_flag");
        // 实体类包名
        generationPo.setEntityPackage("povo");
        // mapper包名
        generationPo.setMapperPackage("mapper");
        generationPo.setMapperXmlPackage("mapper");
        generationPo.setServicePackage("service");
        generationPo.setServiceImplPackage("service.impl");
        generationPo.setControllerPackage("controller");
        // 模板
        generationPo.setEntityTemplate("/templates/default/java/entity.java");
        generationPo.setMapperTemplate("/templates/default/java/mapper.java");
        generationPo.setMapperXmlTemplate("/templates/default/xml/mapper.xml");
        generationPo.setServiceTemplate("/templates/default/java/service.java");
        generationPo.setServiceImplTemplate("/templates/default/java/serviceImpl.java");
        generationPo.setControllerTemplate("/templates/default/java/controller.java");
        // 添加自定义模板
        List<CustomFile> customFiles = new ArrayList<>();
        CustomFile constants = new CustomFile.Builder()
                .fileName("/constants.txt")
                .templatePath("/templates/default/constants.vm")
                .packageName("constants")
                .enableFileOverride().build();
        CustomFile apiTs = new CustomFile.Builder()
                .formatNameFunction(tableInfo -> {
                    // 小驼峰表名
                    String camelCase = StringUtils.toCamelCase(tableInfo.getName());
                    // vue/表/api/小驼峰.api.ts
                    return "/"+camelCase+"/api/"+ camelCase;
                })
                .fileName(".api.ts")
                .templatePath("/templates/default/ts/api.ts.vm")
                .packageName("vue")
                .enableFileOverride().build();
        CustomFile vueIndex = new CustomFile.Builder()
                .formatNameFunction(tableInfo -> {
                    // 小驼峰表名
                    String camelCase = StringUtils.toCamelCase(tableInfo.getName());
                    // vue/表/views/index.vue
                    return "/"+camelCase+"/views/index";
                })
                .fileName(".vue")
                .templatePath("/templates/default/vue/index.vue.vm")
                .packageName("vue")
                .enableFileOverride().build();

        CustomFile sql = new CustomFile.Builder()
                .formatNameFunction(tableInfo -> {
                    // 小驼峰表名
                    String camelCase = StringUtils.toCamelCase(tableInfo.getName());
                    // sql/表.sql
                    return "/"+camelCase;
                })
                .fileName(".sql")
                .templatePath("/templates/default/menus/menus.sql.vm")
                .packageName("sql")
                .enableFileOverride().build();
        customFiles.add(constants);
        customFiles.add(apiTs);
        customFiles.add(vueIndex);
        customFiles.add(sql);
        // 添加自定义参数
        Map<String, Object> map = new HashMap<>();
        generationPo.setOtherTemplates(customFiles);
        generationPo.setOtherTemplateParams(map);
        return generationPo;
    }


}
